﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

//int main() 
//{
//    stringstream ss("1 2 3");
//    string str1 = ss.str(); // str用于获取ss整个内容
//    string str2;
//    ss >> str2;
//    cout << "str1: " << str1 << endl;
//    cout << "str2: " << str2 << endl;
//    cout << endl;
//    ss << "Name: " << "张三" << ", Age: " << 18;
//    str1 = ss.str();
//    cout << "str1: " << str1 << endl;
//    // cout << ss << endl; 注意：这种操作是错误的，因为stringstream本身就是字符串流
//    return 0;
//}


//class Solution {
//public:
//    int longestPalindromeSubseq(string s) {
//        int n = s.size();
//        if (n == 1) return 1;
//        vector<vector<int>> dp(n, vector<int>(n, 1));
//        for (int i = n - 2; i >= 0; i--)
//        {
//            for (int j = i + 1; j < n; j++)
//            {
//                if (s[i] == s[j])
//                {
//                    dp[i][j] = i + 1 == j ? 2 : dp[i + 1][j - 1] + 2;
//                }
//                else
//                {
//                    dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]);
//                }
//            }
//        }
//        return dp[0][n - 1];
//    }
//};


//class Solution {
//public:
//    int minInsertions(string s) {
//        int n = s.size();
//        vector<vector<int>> dp(n, vector<int>(n));
//        for (int i = n - 2; i >= 0; i--)
//        {
//            for (int j = i + 1; j < n; j++)
//            {
//                if (s[i] == s[j]) dp[i][j] = i + 1 == j ? 0 : dp[i + 1][j - 1];
//                else dp[i][j] = min(dp[i][j - 1], dp[i + 1][j]) + 1;
//            }
//        }
//        return dp[0][n - 1];
//    }
//};


//class Solution {
//public:
//    int longestCommonSubsequence(string text1, string text2) {
//        int n = text1.size(), m = text2.size();
//        vector<vector<int>> dp(n + 1, vector<int>(m + 1));
//        for (int i = 1; i <= n; i++)
//        {
//            for (int j = 1; j <= m; j++)
//            {
//                if (text1[i - 1] == text2[j - 1])
//                {
//                    dp[i][j] = dp[i - 1][j - 1] + 1;
//                }
//                else
//                {
//                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
//                }
//            }
//        }
//        return dp[n][m];
//    }
//};


//class Solution {
//public:
//    int numDistinct(string s, string t) {
//        int n = t.size(), m = s.size();
//        vector<vector<double>> dp(n + 1, vector<double>(m + 1));
//        for (int i = 0; i <= m; i++) dp[0][i] = 1;
//        for (int i = 1; i <= n; i++)
//        {
//            for (int j = 1; j <= m; j++)
//            {
//                if (t[i - 1] == s[j - 1])
//                {
//                    dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1];
//                }
//                else
//                {
//                    dp[i][j] = dp[i][j - 1];
//                }
//            }
//        }
//        return dp[n][m];
//    }
//};